import json
import re

import requests
from lxml import etree

"""
    requrest 请求url获取数据
    可以使用text获取字符串类型的响应体
    也可以使用content获取字节类型的响应体
"""

# 入口url
base_url = 'https://desk.zol.com.cn/'
def get_urls():
    '''
    获取所有分类的子url
    :return:
    '''
    res = requests.get(base_url)
    tree = etree.HTML(res.text)
    hrefs = tree.xpath('//*[@id="main"]/dl[1]/dd/a/@href')  # 获取到分类筛选中的a标签的href
    urls = []
    for href in hrefs:
        urls.append(base_url + href)
    return urls


def analyse_data(url):
    '''
    解析每一个分类中的图片分组，没有做分页操作，只获取了一页的数据
    :param url: 一种图片大类的url
    :param num:
    '''
    # print("类型url"+url)
    res = requests.get(url)
    res.encoding = 'gbk'
    tree = etree.HTML(res.text)
    # print(res.text)
    img_urls = tree.xpath('//ul[@class="pic-list2  clearfix"]/li/a/@href')
    for img_url in img_urls:
        if img_url.split('.')[-1] != 'exe':
            image_data(base_url+img_url)
            break # 先只爬取一个分类的图片

def image_data(images_url):
    '''
    获取每种图片分组的url然后下载图片
    :param image_url: 一种分组的url
    :param page_num:
    :return:
    '''
    # print(images_url)
    res = requests.get(images_url)
    # 根据re表达式获取script中的每张图片的高清大图地址
    result = re.compile(r'var deskPicArr.*?=(?P<datas>.*?);')
    pic_data = result.search(res.text)
    # print(pic_data.groups('datas'))
    json_data = pic_data.groups('datas')[0] # 获取json数据
    data_list = json.loads(json_data)['list'] # 将json数据转换成字典，获取list数据
    # 循环获取每个图片的地址，然后下载
    for img_info in data_list:
        pic_id = img_info.get('picId')
        ori_size = img_info.get('oriSize')
        pic_url = img_info.get('imgsrc').replace('##SIZE##', ori_size)
        download_img(pic_url, pic_id, images_url)

def download_img(img_url, img_id, referer_url):
    '''
    下载图片
    :param img_url:
    :param img_id:
    :return:
    '''
    print(img_url, img_id, referer_url)

    # 有一个小小的反爬，需要设置refere
    headers = {
        'referer': referer_url,
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',
    }

    img_data = requests.get(img_url, headers=headers)
    file_name = img_id + '.' + img_url.split('/')[-1].split('.')[-1]
    with open('../image/'+file_name, mode='wb') as f:
        f.write(img_data.content) # 因为请求过来的是字符串，所以要将字符串转化成字节码，写入文件中



if __name__ == '__main__':
    urls = get_urls()
    index = 0
    for url in urls:
        if index == 1:
            analyse_data(url)
        index += 1
